package br.com.faculdade.application.controller;

import br.com.faculdade.domain.service.ApartamentoService;
import br.com.faculdade.infrastructure.entity.Apartamento;
import br.com.faculdade.infrastructure.entity.TipoApartamento;
import java.util.List;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.log.Log;

/**
 *
 * @author Kirmaier Andrade
 */
@Scope(ScopeType.SESSION)
@Name("apartamentoAction")
public class ApartamentoController extends BaseController {

    @Logger
    private Log log;
    //Injeção de Service para manipulação
    @In
    private ApartamentoService apartamentoService;
    //Objetos
    private Apartamento apartamento;
    @DataModel("apartamentos")
    private List<Apartamento> apartamentosDM;
    @DataModelSelection("apartamentos")
    private Apartamento apartamentoSelecionado;
    private List<TipoApartamento> tiposApartamentos;
    //Parametro para o Create e Update em mesma página
    private Operacao operacaoAtual;
    //Parametros de pesquisa
    private Integer paramNumeroApartamento;
    private Integer paramNumeroQuartos;
    private String paramDescricao;
    private Integer tipoApartamentoSelecionado;
    //Parametros de navegação
    private static final String APARTAMENTO = "apartamento";
    private static final String CRIAR_ALTERAR_APARTAMENTO = "criar_alterar_apartamento";

    @Create
    public String setup() {

        paramNumeroApartamento = null;
        paramNumeroQuartos = null;
        paramDescricao = null;
        tipoApartamentoSelecionado = null;

        apartamento = null;

        apartamentosDM = null;

        tiposApartamentos = apartamentoService.obterTodosTiposApartamento();

        return APARTAMENTO;
    }

    @Begin
    public String criarSetup() {
        operacaoAtual = Operacao.CRIACAO;

        apartamento = apartamentoService.criar();

        return CRIAR_ALTERAR_APARTAMENTO;
    }

    @End
    public String criar() {
        try {
            apartamentoService.salvar(apartamento, tipoApartamentoSelecionado);

            adicionarMensagemInformacao("msgCriarApartamentoSucesso");

            pesquisar();

            return APARTAMENTO;
        } catch (Exception e) {
            log.error(e);

            adicionarMensagemErro("msgCriarApartamentoError");
        }
        return APARTAMENTO;
    }

    @Begin
    public String alterarSetup() {
        operacaoAtual = Operacao.ALTERACAO;

        apartamento = apartamentoService.obterPorId(apartamentoSelecionado.getIdapart());

        tipoApartamentoSelecionado = apartamento.getTipoApartamento().getIdtipo();

        return CRIAR_ALTERAR_APARTAMENTO;
    }

    @End
    public String alterar() {
        try {
            apartamentoService.alterar(apartamento, tipoApartamentoSelecionado);

            adicionarMensagemInformacao("msgAlterarApartamentoSucesso");

            pesquisar();

            return APARTAMENTO;
        } catch (Exception e) {
            log.error(e);
            adicionarMensagemErro("msgAlterarApartamentoError");
        }
        return APARTAMENTO;
    }

    public String excluir() {
        apartamento = apartamentoService.obterPorId(apartamentoSelecionado.getIdapart());

        try {
            apartamentoService.excluir(apartamento);

            adicionarMensagemInformacao("msgExcluirApartamentoSucesso");

            pesquisar();
        } catch (Exception e) {
            log.error(e);

            adicionarMensagemErro("msgExcluirApartamentoError");
        }
        return null;
    }

    public void pesquisar() {
        apartamentosDM = apartamentoService.obterPorParametros(paramNumeroApartamento, paramNumeroQuartos, paramDescricao, tipoApartamentoSelecionado);
    }

    public void detalhar() {
        apartamento = apartamentoSelecionado;
    }

    @End
    public String cancelar() {
        if (operacaoAtual == Operacao.ALTERACAO || operacaoAtual == Operacao.DETALHAMENTO) {
            apartamentoService.cancelar();
        }
        return APARTAMENTO;
    }


    //<editor-fold defaultstate="collapsed" desc="GETters e SETters">
    public Integer getTipoApartamentoSelecionado() {
        return tipoApartamentoSelecionado;
    }

    public void setTipoApartamentoSelecionado(Integer tipoApartamentoSelecionado) {
        this.tipoApartamentoSelecionado = tipoApartamentoSelecionado;
    }

    public Apartamento getApartamento() {
        return apartamento;
    }

    public void setApartamento(Apartamento apartamento) {
        this.apartamento = apartamento;
    }

    public Operacao getOperacaoAtual() {
        return operacaoAtual;
    }

    public void setOperacaoAtual(Operacao operacaoAtual) {
        this.operacaoAtual = operacaoAtual;
    }

    public String getParamDescricao() {
        return paramDescricao;
    }

    public void setParamDescricao(String paramDescricao) {
        this.paramDescricao = paramDescricao;
    }

    public Integer getParamNumeroApartamento() {
        return paramNumeroApartamento;
    }

    public void setParamNumeroApartamento(Integer paramNumeroApartamento) {
        this.paramNumeroApartamento = paramNumeroApartamento;
    }

    public Integer getParamNumeroQuartos() {
        return paramNumeroQuartos;
    }

    public void setParamNumeroQuartos(Integer paramNumeroQuartos) {
        this.paramNumeroQuartos = paramNumeroQuartos;
    }

    public List<TipoApartamento> getTiposApartamentos() {
        return tiposApartamentos;
    }

    public void setTiposApartamentos(List<TipoApartamento> tiposApartamentos) {
        this.tiposApartamentos = tiposApartamentos;
    }
    //</editor-fold>
}
